//题目:
// 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。
// 现在，可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线，这些直线需要同时满足：
//  nums1[i] == nums2[j]
// 且绘制的直线不与任何其他连线（非水平线）相交。
// 请注意，连线即使在端点也不能相交：每个数字只能属于一条连线。
// 以这种方法绘制线条，并返回可以绘制的最大连线数。
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) 
    {
        int n1=nums1.size(),n2=nums2.size();
        //提议转换：求nums1和nums2中最大公共子序列的长度
        //1.创建dp表————dp[i][j]表示：nums1中[0,i]区间和nums2中[0,j]区间，最大公共子序列的长度
        vector<vector<int>> dp(n1+1,vector<int>(n2+1));
        //2.初始化 ———— 虚拟行、列
        //3.填表 ———— 从上往下、从左往右
        for(int i=1;i<n1+1;i++)
        {
            for(int j=1;j<n2+1;j++)
            {
                if(nums1[i-1]==nums2[j-1])
                    dp[i][j]=dp[i-1][j-1]+1;
                else
                    dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
            }
        }
        //4.确定返回值
        return dp[n1][n2];
    }
};